home *** CD-ROM | disk | FTP | other *** search
/ The PC-SIG Library 9 / The PC-SIG Library on CD ROM - Ninth Edition.iso / 501_600 / DISK0579 / DISK0579.ZIP / CHAP16.TXT < prev    next >
Text File  |  1989-12-01  |  14KB  |  354 lines

  1.  
  2.  
  3.  
  4.                                                    Chapter 16
  5.                                               VIRTUAL METHODS
  6.  
  7.  
  8. Since we covered encapsulation and inheritance in the last
  9. chapter, we are left with only virtual methods to complete the
  10. major topics of object oriented programming.  Virtual methods,
  11. as they are called in TURBO Pascal, have several other names
  12. in the literature to describe the same technique.  This
  13. technique is sometimes called run-time binding or late binding
  14. referring to when the decision is made as to what method will
  15. respond to the message.  The use of virtual methods moves the
  16. responsibility of selection from the client (the logic sending
  17. the message) to the supplier (the methods responding to the
  18. message).  We will begin with a skeleton of a program without
  19. a virtual method and add one to show the effect of adding a
  20. virtual method.
  21.  
  22.  
  23. WITHOUT A VIRTUAL METHOD
  24. ____________________________________________________________
  25.  
  26. The example program named VIRTUAL1.PAS will  ================
  27. be used as the starting point for the study    VIRTUAL1.PAS
  28. of virtual functions.  We must state that    ================
  29. this program does not contain a virtual
  30. function, it is only the starting point for
  31. studying them.
  32.  
  33. The objects included here are very similar to the objects
  34. describing vehicles which we were working with in the last
  35. chapter.  You will notice that all three objects contain a
  36. method named Message in lines 11, 20, and 31.  The Message
  37. method will be the center of our study in the first three
  38. example programs.  It should be pointed out that the
  39. constructors for the three objects are called in lines 98
  40. through 100 even though a constructor call is still not
  41. absolutely necessary in this case.  We will have more to say
  42. about the constructor calls during the next example program.
  43.  
  44. Compile and execute the program and you will find that even
  45. though it is legal to pass the objects of type Car and Truck
  46. to the method named Output_A_Message in lines 109 and 110, the
  47. method that is called from line 86 is the method named Message
  48. in the parent type Vehicle.  This is probably no surprise to
  49. you since we defined an object of type Vehicle as a formal
  50. parameter of the method Output_A_Message.  We need only one
  51. small change and we will have a virtual procedure call.
  52.  
  53. Even though this program seems to do very little, it will be
  54. the basis of our study of virtual methods so you should study
  55. the code in detail.
  56.  
  57.  
  58.  
  59.                                                     Page 16-1
  60.  
  61.                                               Virtual Methods
  62.  
  63. NOW TO MAKE IT A VIRTUAL METHOD
  64. ____________________________________________________________
  65.  
  66. Examine the example program named            ================
  67. VIRTUAL2.PAS, and you will find only one       VIRTUAL2.PAS
  68. small change in the code but a world of      ================
  69. difference in the way it executes.
  70.  
  71. The careful student will notice the addition of the reserved
  72. word virtual in lines 13, 22, and 33.  This makes the method
  73. named Message a virtual method which operates a little
  74. differently from the way it did in the last program.  Once
  75. again, we call the three constructors in lines 100 through 102
  76. and this time the constructor calls are absolutely essential. 
  77. We will discuss why in a couple of paragraphs.
  78.  
  79. Once again we send a message to Output_A_Message three times
  80. in lines 110 through 112 and line 88 is used to send a message
  81. to the Message method.  When we compile and execute this
  82. program, we find that even though the method Output_A_Message
  83. only uses the parent type Vehicle, the system calls the
  84. correct procedure based on the type of the actual object
  85. passed to this method.  The system sends a message to the
  86. objects of the correct type instead of to the parent type as
  87. may be expected.  It should be clear to you that the object
  88. that is to receive the message is not known at compile time
  89. but must be selected at run time when the object arrives at
  90. the method Output_A_Message.  This is known as late binding
  91. since the type is not known until run time as opposed to early
  92. binding where the type is known at compile time.  Every
  93. subprogram call in this entire tutorial, up to this point, has
  94. been early binding.
  95.  
  96. You will note that even though the method Output_A_Message
  97. only knows about the objects of type Vehicle, it has the
  98. ability to pass through other types, provided of course that
  99. they are descendant types of Vehicle.  The method
  100. Output_A_Message only passes the message through, it does not
  101. do the selection.  The selection is done by the objects
  102. themselves which answer the messages passed to them.  This
  103. means that the sender does not know where the message will be
  104. answered from, and it is up to the receiver to find that a
  105. message is being sent its way and to respond to it.  It is
  106. often said that the supplier (the method doing the work) must
  107. make the decision to answer the message, rather than the
  108. client (the user of the work done).  The burden is placed on
  109. the supplier to do the right thing.
  110.  
  111. If a method is declared virtual, all methods of that name must
  112. also be virtual including all ancestors and all descendants. 
  113. It is not possible to declare part of the methods of the same
  114. name virtual and part standard.  All parameter lists for all
  115. virtual methods of the same name must also be identical since
  116.  
  117.                                                     Page 16-2
  118.  
  119.                                               Virtual Methods
  120.  
  121. they must all be capable of being called by the same method
  122. call.
  123.  
  124.  
  125.  
  126. ASSIGNING DESCENDANTS TO ANCESTORS?
  127. ____________________________________________________________
  128.  
  129. It is legal in any object oriented language to assign a
  130. descendant object to an ancestor variable but the reverse is
  131. not true.  A vehicle, for example, can be used to define a
  132. car, a truck, a bus, or any number of other kinds of vehicles
  133. so it can be assigned any of those values.  A car on the other
  134. hand, is too specific to be used for the definition of
  135. anything but a car, so it cannot have any other value assigned
  136. to it.  A vehicle is very general and can cover a wide range
  137. of values, but a car is very specific and can therefore only
  138. define a car.
  139.  
  140.  
  141.  
  142. WHY USE A CONSTRUCTOR?
  143. ____________________________________________________________
  144.  
  145. The constructor is absolutely required in this case because
  146. of the way the authors of TURBO Pascal defined the use of
  147. virtual functions.  The constructor sets up a pointer to a
  148. virtual method table (VMT) which is used to find the virtual
  149. methods.  If there is no pointer, the system jumps off to some
  150. unknown location and tries to execute whatever happens to be
  151. there and could do almost anything at that unknown and
  152. undefined point in the code.  So it is important to call a
  153. constructor once for each object as is done here so the
  154. pointer to the VMT can be initialized to the proper value. 
  155. If you make several objects of one type, it is not enough to
  156. call a constructor for one object and copy that object into
  157. each of the other objects.  Each object must have its own
  158. constructor call in order to prevent a system crash.
  159.  
  160. The strange looking code in line 6 tells the system to check
  161. each call to a virtual function to see if the constructor has
  162. been called.  This slows the program down slightly but will
  163. result in an error message if a virtual method is called prior
  164. to its VMT being properly set up with a constructor call. 
  165. After a program is thoroughly tested, the code can be removed
  166. from line 6 to speed up the program slightly by eliminating
  167. the checks.  Be warned however, that a call to a virtual
  168. method without A VMT will probably result in the computer
  169. hanging up.
  170.  
  171.  
  172.  
  173.  
  174.  
  175.  
  176.                                                     Page 16-3
  177.  
  178.                                               Virtual Methods
  179.  
  180. VIRTUALS AND POINTERS
  181. ____________________________________________________________
  182.  
  183. The example program named VIRTUAL3.PAS is    ================
  184. nearly identical to the last program except    VIRTUAL3.PAS
  185. that this program uses pointers to objects   ================
  186. instead of using the objects directly.
  187.  
  188. You will notice that once again, the methods named Message are
  189. all defined as virtual and a pointer type is defined for each
  190. object type.  In lines 99 through 101, three pointers are
  191. declared and memory is dynamically allocated on the heap for
  192. the objects themselves.  The objects are all sent a
  193. constructor message to initialize the stored data within the
  194. objects and to set up the VMT for each.  The rest of the
  195. program is nearly identical to the last program except that
  196. Dispose procedures are called for each of the dynamically
  197. allocated objects.  The code used in line 6 of the last
  198. program to force a check of each virtual method call has been
  199. removed to illustrate that it doesn't have to be there if you
  200. are sure a message is sent to a constructor once for each
  201. object with a virtual method.
  202.  
  203. Compiling and executing this program will give the same result
  204. as the last program indicating that it is perfectly legal to
  205. use pointers to objects as well as the objects themselves.
  206.  
  207.  
  208.  
  209. AN ANCESTOR OBJECT
  210. ____________________________________________________________
  211.  
  212. The example program PERSON.PAS is not a      ================
  213. complete program at all but only an object      PERSON.PAS
  214. definition within a unit.  This unit should  ================
  215. pose no problem for you to understand so we
  216. will not say much except to point out that
  217. the method named Display is a virtual method.
  218.  
  219. This example program, as well as the next two example
  220. programs, have been carefully selected to illustrate the
  221. proper way to package objects for use in a clear
  222. understandable manner.
  223.  
  224. Compile this unit to disk in order to make it available for
  225. use in the remainder of this chapter.
  226.  
  227.  
  228.  
  229. SOME DESCENDENT OBJECTS
  230. ____________________________________________________________
  231.  
  232. The example program named SUPERVSR.PAS is another unit which
  233. contains three descendants of the previously defined object
  234.  
  235.                                                     Page 16-4
  236.  
  237.                                               Virtual Methods
  238.  
  239. named Person.  You will notice that each of   ================
  240. the objects have a method named Display which   SUPERVSR.PAS
  241. is virtual just as the same method in the     ================
  242. ancestor object was.
  243.  
  244. The interface for each object has been purposely kept very
  245. simple in order to illustrate the use of objects.  The
  246. implementation has also been kept as simple as possible for
  247. the same reason so the diligent student should have no trouble
  248. in understanding this unit completely.
  249.  
  250. Once again, be sure to compile this unit to disk in order to
  251. make it available for use in the next few example programs. 
  252.  
  253.  
  254.  
  255. A COMPLETE EMPLOYEE PROGRAM
  256. ____________________________________________________________
  257.  
  258. Although the program named EMPLOYEE.PAS is a  ================
  259. very short program that does very little, it    EMPLOYEE.PAS
  260. is a complete program to handle a very small  ================
  261. amount of data about your employees.
  262.  
  263. You will notice that we declare an array of ten pointers to
  264. the Person_ID object and one pointer to each of the three
  265. descendant objects.  In the main program we send a message to
  266. the constructor for each of the array elements.  Inspection
  267. of the Person_ID.Init code will reveal that this
  268. initialization does nothing.  It is used to initialize the
  269. pointer to the VMT for each object, so the message must be
  270. sent.  We then dynamically allocate six objects of assorted
  271. descendant objects being careful to send a message to the
  272. constructor for each object.  This is done to generate a VMT
  273. for each object as it is allocated.  Finally, we send a
  274. message to the first six objects pointed to by the array of
  275. pointers instructing them to display their values.
  276.  
  277. When the program is compiled and executed, we find that the
  278. virtual methods were called as explained in the last example
  279. program.  Even though only one kind of pointer was passed to
  280. the Display method, three different messages were actually
  281. displayed, each message being of the proper kind based on the
  282. type of pointer used.
  283.  
  284. You will notice how clean and neat the main program is.  It
  285. is extremely easy to follow because all of the implementation
  286. details have been moved to the objects themselves.  Once the
  287. objects are carefully defined and debugged, the main program
  288. is usually a snap to write and debug.
  289.  
  290. Object oriented programming requires a whole new mindset over
  291. the procedural methods you have been using but after you catch
  292. on to the technique, you will find your programs much easier
  293.  
  294.                                                     Page 16-5
  295.  
  296.                                               Virtual Methods
  297.  
  298. to debug and maintain.  The one thing you should avoid is the
  299. use of too many objects in your first program.  It is best to
  300. define a few simple objects for your first attempt at object
  301. oriented programming and write the rest of the program using
  302. standard procedural methods.  Then as you gain experience, you
  303. can begin using more and more objects until you finally write
  304. a program that is essentially all objects.  Of course, you
  305. will find that you will always write at least part of your
  306. program in a standard procedural format as was done in
  307. EMPLOYEE.PAS in this chapter.
  308.  
  309.  
  310.  
  311. PROGRAMMING EXERCISE
  312. ____________________________________________________________
  313.  
  314. 1.   Add a new object type to SUPERVSR.PAS to define a
  315.      Consultant defining appropriate data fields for him, then
  316.      add a couple of Consultant type objects to EMPLOYEE.PAS
  317.      to use the new object type.
  318.  
  319.  
  320.  
  321.  
  322.  
  323.  
  324.  
  325.  
  326.  
  327.  
  328.  
  329.  
  330.  
  331.  
  332.  
  333.  
  334.  
  335.  
  336.  
  337.  
  338.  
  339.  
  340.  
  341.  
  342.  
  343.  
  344.  
  345.  
  346.  
  347.  
  348.  
  349.  
  350.  
  351.  
  352.  
  353.                                                     Page 16-6
  354.